
const DEFAULT_COMPARE=(a,b)=>{return a===b};

/**
 * 状态判断
 *  @param stats
 */
export default class State{
    constructor(...state) {
        this._state = [...state];
        this._compare = DEFAULT_COMPARE;
        this._changeCall=null;
    }

    /**
     * 状态改变时的回调
     * @param func
     */
    set onChange(func){
        this._changeCall=func;
    }

    /**
     * 自定义比较函数
     * @param func
     */
    set compare(func){
        this._compare=func;
    }

    /**
     * 获取状态序列
     * @returns {array}
     */
    get stats(){
        return this._state;
    }

    /**
     * 给定的值都存在时返回true
     * @param stats
     * @returns {boolean}
     */
    exist(...stats){
        for(let st of stats){
            let index=this._state.findIndex((s)=>this._compare(s,st));
            if(index===-1)return false;
        }
        return true;
    }

    /**
     * 给定的值其中之一存在时返回true
     * @param stats
     * @returns {boolean}
     */
    anyExist(...stats){
        for(let st of stats){
            let index=this._state.findIndex((s)=>this._compare(s,st));
            if(index!==-1)return true;
        }
        return false;
    }

    /**
     * 给定的值都不存在时返回true
     * @param stats
     * @returns {boolean}
     */
    notExist(...stats){
        for(let st of stats){
            let index=this._state.findIndex((s)=>this._compare(s,st));
            if(index!==-1)return false;
        }
        return true;
    }

    /**
     * 给定的值其中之一不存在时返回true
     * @param stats
     * @returns {boolean}
     */
    anyNotExist(...stats){
        for(let st of stats){
            let index=this._state.findIndex((s)=>this._compare(s,st));
            if(index===-1)return true;
        }
        return false;
    }

    /**
     * 添加状态值
     * @param stats
     */
    add(...stats){
        for(let st of stats){
            if(this._state.findIndex((s)=>this._compare(s,st))===-1)this._state.push(st);
        }
        if(this._changeCall)this._changeCall();
    }

    /**
     * 移除状态值
     * @param stats
     */
    remove(...stats){
        for(let st of stats){
            let index=this._state.findIndex((s)=>this._compare(s,st));
            if(index===-1)continue;
            this._state.splice(index,1);
        }
        if(this._changeCall)this._changeCall();
    }

    /**
     * 清除状态值
     */
    clear(){
        this._state=[];
        if(this._changeCall)this._changeCall();
    }
}